﻿#include "FITKAbaMaterialOrientation.h"
#include "FITK_Kernel/FITKCore/FITKDataRepo.h"
#include "FITK_Interface/FITKInterfaceModel/FITKModelSet.h"

namespace Interface
{

    void FITKAbaMaterialOrientation::setMaterialOrientationDefTpye(MaterialOrientationDef t)
    {
        _materialOriDef = t;
    }


    FITKAbaMaterialOrientation::MaterialOrientationDef FITKAbaMaterialOrientation::getMaterialOrientationDefTpye() const
    {
        return _materialOriDef;
    }

    /**
     * @brief 设置模型集ID
     * @param id 模型集的唯一标识符
     */
    void FITKAbaMaterialOrientation::setModelSetID(const int id)
    {
        _setID = id;
    }

    /**
     * @brief 获取模型集ID
     * @return 模型集的唯一标识符
     */
    int FITKAbaMaterialOrientation::getModelSetID() const
    {
        return _setID;
    }

    /**
     * @brief 设置坐标系统ID
     * @param id 坐标系统的唯一标识符
     */
    void FITKAbaMaterialOrientation::setCsysID(const int id)
    {
        _csysID = id;
    }

    /**
     * @brief 获取坐标系统ID
     * @return 坐标系统的唯一标识符
     */
    int FITKAbaMaterialOrientation::getCsysID() const
    {
        return _csysID;
    }

    /**
     * @brief 设置旋转轴索引
     * @param index 旋转轴的索引号码
     */
    void FITKAbaMaterialOrientation::setRotateAxis(const int index)
    {
        _rotateAxisIndex = index;
    }

    /**
     * @brief 获取旋转轴索引
     * @return 旋转轴的索引号码
     */
    int FITKAbaMaterialOrientation::getRotateAxis() const
    {
        return _rotateAxisIndex;
    }

    /**
     * @brief 设置旋转角度
     * @param angle 旋转的角度，以度为单位
     */
    void FITKAbaMaterialOrientation::setRotateAngle(const double angle)
    {
        _rotateAngle = angle;
    }

    /**
     * @brief 获取旋转角度
     * @return 旋转的角度，以度为单位
     */
    double FITKAbaMaterialOrientation::getRotateAngle() const
    {
        return _rotateAngle;
    }

    void FITKAbaMaterialOrientation::enableAdditionRotationAngle(bool en /*= true */)
    {
        _enableRotationAngle = en;
    }

    bool FITKAbaMaterialOrientation::isEnableAdditionRotationAngle() const
    {
        return _enableRotationAngle;
    }

    /**
     * @brief 设置堆叠方向
     * @param dir 堆叠方向的索引号码
     */
    void FITKAbaMaterialOrientation::setStackingDir(const int dir)
    {
        _stackingDir = dir;
    }

    /**
     * @brief 获取堆叠方向
     * @return 堆叠方向的索引号码
     */
    int FITKAbaMaterialOrientation::getStackingDir() const
    {
        return _stackingDir;
    }

    /**
     * @brief 获取关联的部件
     * @return 部件的抽象接口指针
     * @note 通过模型集ID从数据仓库获取模型集，然后返回模型集中的抽象模型指针
     */
    Interface::FITKAbstractModel* FITKAbaMaterialOrientation::getPart()
    {
        FITKModelSet* set = FITKDATAREPO->getTDataByID<FITKModelSet>(_setID);
        if (set == nullptr) return nullptr;
        return set->getAbstractModel();
    }

    bool FITKAbaMaterialOrientation::copy(FITKAbstractDataObject* obj)
    {
        //错误判断
        FITKAbaMaterialOrientation* ori = dynamic_cast<FITKAbaMaterialOrientation*>(obj);
        if (ori == nullptr) return false;
        //复制值
        Core::FITKAbstractNDataObject::copy(obj);
        _materialOriDef = ori->getMaterialOrientationDefTpye();
        _setID = ori->getModelSetID();
        _csysID = ori->getCsysID();
        _rotateAxisIndex = ori->getRotateAxis();
        _enableRotationAngle = ori->isEnableAdditionRotationAngle();
        _rotateAngle = ori->getRotateAngle();
        _stackingDir = ori->getStackingDir();
        return true;
    }

    /**
     * @brief 根据模型集ID获取材料定向实例
     * @param setID 模型集的唯一标识符
     * @return 材料定向的实例指针
     * @note 遍历材料定向管理器中的所有材料定向，找到匹配模型集ID的实例并返回
     */
    Interface::FITKAbaMaterialOrientation* FITKAbaMaterialOrientationManager::getMaterialOrientation(const int setID)
    {
        const int n = this->getDataCount();
        for (int i =0; i<n; ++i)
        {
            FITKAbaMaterialOrientation* ori = this->getDataByIndex(i);
            if(ori == nullptr) continue;
            if (setID == ori->getModelSetID())
                return ori;
        }
        return nullptr;
    }
}

